package com.ruoyi.manage.service;

import java.util.Date;
import java.util.List;
import java.util.Map;
import com.ruoyi.manage.domain.CrInterviewSlot;

/**
 * 面试时段Service接口
 * 
 * @author ruoyi
 * @date 2024-09-24
 */
public interface ICrInterviewSlotService 
{
    /**
     * 查询面试时段
     * 
     * @param slotId 面试时段主键
     * @return 面试时段
     */
    public CrInterviewSlot selectCrInterviewSlotBySlotId(Long slotId);

    /**
     * 查询面试时段列表
     * 
     * @param crInterviewSlot 面试时段
     * @return 面试时段集合
     */
    public List<CrInterviewSlot> selectCrInterviewSlotList(CrInterviewSlot crInterviewSlot);

    /**
     * 新增面试时段
     * 
     * @param crInterviewSlot 面试时段
     * @return 结果
     */
    public int insertCrInterviewSlot(CrInterviewSlot crInterviewSlot);

    /**
     * 修改面试时段
     * 
     * @param crInterviewSlot 面试时段
     * @return 结果
     */
    public int updateCrInterviewSlot(CrInterviewSlot crInterviewSlot);

    /**
     * 批量删除面试时段
     * 
     * @param slotIds 需要删除的面试时段主键集合
     * @return 结果
     */
    public int deleteCrInterviewSlotBySlotIds(Long[] slotIds);

    /**
     * 删除面试时段信息
     * 
     * @param slotId 面试时段主键
     * @return 结果
     */
    public int deleteCrInterviewSlotBySlotId(Long slotId);

    /**
     * 根据社团ID查询面试时段列表
     * 
     * @param clubId 社团ID
     * @return 面试时段列表
     */
    public List<CrInterviewSlot> selectSlotsByClubId(Long clubId);

    /**
     * 根据招聘ID查询面试时段列表
     * 
     * @param recruitmentId 招聘ID
     * @return 面试时段列表
     */
    public List<CrInterviewSlot> selectSlotsByRecruitmentId(Long recruitmentId);

    /**
     * 查询可用的面试时段
     * 
     * @param recruitmentId 招聘ID
     * @param date 日期
     * @return 可用时段列表
     */
    public List<CrInterviewSlot> selectAvailableSlots(Long recruitmentId, Date date);

    /**
     * 创建面试时段
     * 
     * @param clubId 社团ID
     * @param recruitmentId 招聘ID（可选）
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param location 面试地点
     * @param maxCapacity 最大容量
     * @param description 描述
     * @return 结果
     */
    public int createInterviewSlot(Long clubId, Long recruitmentId, Date startTime, Date endTime, 
                                   String location, Integer maxCapacity, String description);

    /**
     * 批量创建面试时段
     * 
     * @param slots 时段列表
     * @return 成功创建的数量
     */
    public int batchCreateInterviewSlots(List<CrInterviewSlot> slots);

    /**
     * 检查时段冲突
     * 
     * @param clubId 社团ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param excludeSlotId 排除的时段ID（编辑时使用）
     * @return 是否冲突
     */
    public boolean checkTimeConflict(Long clubId, Date startTime, Date endTime, Long excludeSlotId);

    /**
     * 更新时段容量
     * 
     * @param slotId 时段ID
     * @param change 容量变化（+1或-1）
     * @return 结果
     */
    public int updateSlotCapacity(Long slotId, int change);

    /**
     * 获取时段的预约数量
     * 
     * @param slotId 时段ID
     * @return 预约数量
     */
    public int getSlotBookingCount(Long slotId);

    /**
     * 检查时段是否可预约
     * 
     * @param slotId 时段ID
     * @return 是否可预约
     */
    public boolean isSlotAvailable(Long slotId);

    /**
     * 关闭面试时段
     * 
     * @param slotId 时段ID
     * @param clubId 社团ID
     * @return 结果
     */
    public int closeInterviewSlot(Long slotId, Long clubId);

    /**
     * 重新开放面试时段
     * 
     * @param slotId 时段ID
     * @param clubId 社团ID
     * @return 结果
     */
    public int reopenInterviewSlot(Long slotId, Long clubId);

    /**
     * 获取社团的面试时段统计
     * 
     * @param clubId 社团ID
     * @return 统计信息
     */
    public Map<String, Object> getClubSlotStatistics(Long clubId);

    /**
     * 获取时段的详细统计
     * 
     * @param slotId 时段ID
     * @return 统计信息
     */
    public Map<String, Object> getSlotStatistics(Long slotId);

    /**
     * 查询即将开始的面试时段
     * 
     * @param hours 小时数（几小时内开始）
     * @return 时段列表
     */
    public List<CrInterviewSlot> getUpcomingSlots(int hours);

    /**
     * 查询已过期的面试时段
     * 
     * @return 时段列表
     */
    public List<CrInterviewSlot> getExpiredSlots();

    /**
     * 自动更新过期时段状态
     * 
     * @return 更新数量
     */
    public int updateExpiredSlotsStatus();

    /**
     * 复制面试时段（用于批量创建相似时段）
     * 
     * @param sourceSlotId 源时段ID
     * @param targetDates 目标日期列表
     * @return 结果
     */
    public int copyInterviewSlot(Long sourceSlotId, List<Date> targetDates);

    /**
     * 导出面试时段数据
     * 
     * @param crInterviewSlot 查询条件
     * @return 时段列表
     */
    public List<CrInterviewSlot> exportInterviewSlots(CrInterviewSlot crInterviewSlot);
}